package com.atguigu.listener;

import com.rabbitmq.client.Channel;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.core.MessageListener;
import org.springframework.amqp.rabbit.listener.api.ChannelAwareMessageListener;
import org.springframework.stereotype.Component;

import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.lang.annotation.Target;

/**
 * AckListener
 *
 * @Author: 马伟奇
 * @CreateTime: 2021-02-26
 * @Description:
 * 手动签收
 * ① 需要设置手动签收参数 acknowledge="manual"
 * ② 手动签收需要实现 ChannelAwareMessageListener
 *
 *
 */
@Component
public class AckListener implements ChannelAwareMessageListener {
    @Override
    public void onMessage(Message message, Channel channel) throws Exception {
        long deliveryTag = message.getMessageProperties().getDeliveryTag();
        try {

            String msg = new String(message.getBody(), "utf-8");

            // 制造错误
           // int a =  1/0;
            // 进行手动签收
            // 第一个参数表示签收的标签
            // 第二个参数：如果为true表示可以签收所有消息
            channel.basicAck(deliveryTag,true);
            System.out.println(msg);
        } catch (Exception e) {
            e.printStackTrace();
            // 拒绝签收消息
            // 第三个参数：true：让消息重新回到队列
            // false，不需要重新回到队列，丢失消息
            channel.basicNack(deliveryTag,true, true);
        }
    }

//    @Override
//    public void onMessage(Message message){
//        try {
//            String msg = new String(message.getBody(), "utf-8");
//            System.out.println(msg);
//        } catch (Exception e) {
//            e.printStackTrace();
//        }
//
//    }
}